home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 4 / Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso / Development / Source / Telnet 2.6.1d1 4⁄26⁄94 Folder / Krb / des_cornell.c next >
Text File  |  1994-04-16  |  5KB  |  238 lines

  1. /*
  2.  * Des stub routines to use DES routines from Cornell's Kdriver.
  3.  */
  4.  
  5. #ifdef TN3270
  6. #pragma segment 3270tcp
  7. #define bzero xbzero
  8. #endif
  9.  
  10. #include "TelnetHeader.h"
  11.  
  12. #ifdef NCSA_ENC
  13. #pragma segment 22
  14. #define bzero xbzero
  15. #endif
  16.  
  17. #ifndef __powerpc__
  18.  
  19.     #include <Devices.h>
  20.     #include <Files.h>
  21.     #include <Traps.h>
  22.     //#include <SysEqu.h>
  23.  
  24.     #include "glue.h"
  25.     
  26. #endif
  27.  
  28. #include "KrbDriver.h"
  29. #include "encrypt.h"
  30. #include "desproto.h"
  31.  
  32. void bzero(void *, long);
  33.  
  34. static short kdriver = 0;        /* .Kerberos driver ref */
  35. long driverA4;                    /* a4 in driver environment */
  36.  
  37. long (*c_des_new_random_key)(des_cblock key) = 0;
  38. long (*c_des_ecb_encrypt)(unsigned long *clear, unsigned long *cipher, des_key_schedule schedule, long encrypt) = 0;
  39. long (*c_des_set_random_generator_seed)(des_cblock *key) = 0;
  40. long (*c_des_key_sched)(des_cblock k, des_key_schedule schedule) = 0;
  41. void (*c_des_init_random_number_generator)(des_cblock key) = 0;
  42. long (*c_des_pcbc_encrypt)(unsigned char *in, unsigned char * out, register long length,
  43.                         des_key_schedule key, unsigned char *iv, long encrypt) = 0;
  44. long (*c_des_string_to_key)(char *str, unsigned char *key) = 0;
  45. unsigned long (*c_des_quad_cksum) (unsigned char *in, unsigned long *out, long length,
  46.                                long out_count, unsigned char *c_seed) = 0;
  47. long (*c_gettimeofdaynet) (struct timeval *tp, struct timezone *tz) = 0;
  48.  
  49. /*
  50.  * init_cornell_des
  51.  * Returns -2 if no kdriver
  52.  * Returns other error if this kdriver does not have the DES hooks.
  53.  */
  54. long init_cornell_des ()
  55. {
  56. #ifdef __powerpc__
  57.     return(-2);                // Not yet...
  58. #else
  59.     short s;
  60.     ParamBlockRec pb;
  61.     long addrs[10];
  62.     
  63.     /*
  64.      * Open the .Kerberos driver if not already open
  65.      */
  66.     if (!kdriver) {
  67.         if (s = OpenDriver("\p.Kerberos", &kdriver)) {
  68.             return -2;
  69.         }
  70.     }
  71.  
  72.     bzero(&pb, sizeof(ParamBlockRec));
  73.     ((long *)pb.cntrlParam.csParam)[0] = (long)&addrs[0];
  74.     ((long *)pb.cntrlParam.csParam)[1] = sizeof(addrs)/sizeof(long);
  75.     pb.cntrlParam.ioCompletion = nil;
  76.     pb.cntrlParam.ioCRefNum = kdriver;
  77.  
  78.     pb.cntrlParam.csCode = cKrbGetDesPointers;
  79.     if (s = PBControl(&pb, false))
  80.         return s;
  81.     if (s = pb.cntrlParam.ioResult)
  82.         return s;
  83.  
  84.     driverA4 = addrs[0];
  85.     c_des_new_random_key = (long(*)()) addrs[1];
  86.     c_des_ecb_encrypt = (long(*)()) addrs[2];
  87.     c_des_set_random_generator_seed = (long(*)()) addrs[3];
  88.     c_des_key_sched = (long(*)()) addrs[4];
  89.     c_des_init_random_number_generator = (void(*)()) addrs[5];
  90.     c_des_pcbc_encrypt = (long(*)()) addrs[6];
  91.     c_des_string_to_key = (long(*)()) addrs[7];
  92.     c_des_quad_cksum = (unsigned long(*)()) addrs[8];
  93.     c_gettimeofdaynet = (long(*)()) addrs[9];
  94.  
  95.     return 0;
  96. #endif
  97. }
  98.  
  99.  
  100. long des_new_random_key(des_cblock key)
  101. {
  102. #ifndef __powerpc__
  103.     long oldA4;
  104.     long s = 0;
  105.     
  106.     if (c_des_new_random_key) {
  107.         oldA4 = swapA4(driverA4);
  108.         s = (*c_des_new_random_key)(key);
  109.         swapA4(oldA4);
  110.     }
  111.     return s;
  112. #endif
  113. }
  114.  
  115.  
  116. long des_ecb_encrypt(unsigned long *clear, unsigned long *cipher, des_key_schedule schedule, long encrypt)
  117. {
  118. #ifndef __powerpc__
  119.     long oldA4;
  120.     long s = 0;
  121.     
  122.     if (c_des_ecb_encrypt) {
  123.         oldA4 = swapA4(driverA4);
  124.         s = (*c_des_ecb_encrypt)(clear, cipher, schedule, encrypt);
  125.         swapA4(oldA4);
  126.     }
  127.     return s;
  128. #endif
  129. }
  130.  
  131.  
  132. long des_set_random_generator_seed(des_cblock *key)
  133. {
  134. #ifndef __powerpc__
  135.     long oldA4;
  136.     long s = 0;
  137.  
  138.     if (c_des_set_random_generator_seed) {
  139.         oldA4 = swapA4(driverA4);
  140.         s = (*c_des_set_random_generator_seed)(key);
  141.         swapA4(oldA4);
  142.     }
  143.     return s;
  144. #endif
  145. }
  146.  
  147.  
  148. long des_key_sched(des_cblock k, des_key_schedule schedule)
  149. {
  150. #ifndef __powerpc__
  151.     long oldA4;
  152.     long s = 0;
  153.     
  154.     if (c_des_key_sched) {
  155.         oldA4 = swapA4(driverA4);
  156.         s = (*c_des_key_sched)(k, schedule);
  157.         swapA4(oldA4);
  158.     }
  159.     return s;
  160. #endif
  161. }
  162.  
  163.  
  164. void des_init_random_number_generator(des_cblock key)
  165. {
  166. #ifndef __powerpc__
  167.     long oldA4;
  168.     
  169.     if (c_des_init_random_number_generator) {
  170.         oldA4 = swapA4(driverA4);
  171.         (*c_des_init_random_number_generator)(key);
  172.         swapA4(oldA4);
  173.     }
  174. #endif
  175. }
  176.  
  177.  
  178. long des_pcbc_encrypt (unsigned char *in, unsigned char * out, register long length,
  179.                         des_key_schedule key, unsigned char *iv, long encrypt)
  180. {
  181. #ifndef __powerpc__
  182.     long oldA4, s = 0;
  183.     
  184.     if (c_des_pcbc_encrypt) {
  185.         oldA4 = swapA4(driverA4);
  186.         s = (*c_des_pcbc_encrypt)(in, out, length, key, iv, encrypt);
  187.         swapA4(oldA4);
  188.     }
  189.     return s;
  190. #endif
  191. }
  192.  
  193.  
  194. long des_string_to_key (char *str, unsigned char *key)
  195. {
  196. #ifndef __powerpc__
  197.     long oldA4, s = 0;
  198.     
  199.     if (c_des_string_to_key) {
  200.         oldA4 = swapA4(driverA4);
  201.         s = (*c_des_string_to_key)(str, key);
  202.         swapA4(oldA4);
  203.     }
  204.     return s;
  205. #endif
  206. }
  207.  
  208. unsigned long des_quad_cksum (unsigned char *in, unsigned long *out, long length,
  209.                                long out_count, unsigned char *c_seed)
  210. {
  211. #ifndef __powerpc__
  212.     long oldA4;
  213.     unsigned long s = 0;
  214.     
  215.     if (c_des_quad_cksum) {
  216.         oldA4 = swapA4(driverA4);
  217.         s = (*c_des_quad_cksum)(in, out, length, out_count, c_seed);
  218.         swapA4(oldA4);
  219.     }
  220.     return s;
  221. #endif
  222. }
  223.  
  224.  
  225. long gettimeofdaynet (struct timeval *tp, struct timezone *tz)
  226. {
  227. #ifndef __powerpc__
  228.     long oldA4, s = 0;
  229.     
  230.     if (c_gettimeofdaynet) {
  231.         oldA4 = swapA4(driverA4);
  232.         s = (*c_gettimeofdaynet)(tp, tz);
  233.         swapA4(oldA4);
  234.     }
  235.     return s;
  236. #endif
  237. }
  238.